/**
 * 从数组的开头和结尾向中间寻找，返回索引数组
 * @param {Array} list 传入的数组
 * @param {any} target 在数组中查找的目标
 * @param {boolean} execute_once=false 是否只执行一次
 * @param {boolean} isObject=false 是否是对象数组
 * @param {string||null} obj_key=null 如果是对象数组，就传递一个在数组中对象中要找的键
 * @return Array
 * */
function findFromFirstAndFromLastToCenter(
    list, // 数组
    target, // 查找目标
    execute_once=false, // 执行一次
    isObject=false, // 在数组中寻找的一个对象中的键
    obj_key=null // 键值
) {
    if (Object.prototype.toString.call(list) !== '[object Array]') {
        throw new Error('请传入一个数组')
    }
    if (list.length < 2) {
        return [0]
    }
    const index_arr = []
    const is_even_number_or_odd_number = list.length % 2 === 1
    // 计算循环次数
    const circulation_times = Math.floor(list.length / 2)
    // 获取数组最后一位
    const last_index = list.length - 1
    // 如果是要从对象数组的每个对象中查找键
    if (isObject) {
        for (let i = 0; i < circulation_times; i++) {
            if (list[i][obj_key] === target) {
                index_arr.push(i)
            } else if (list[last_index - i][obj_key] === target) {
                index_arr.push(last_index - i)
            }
            if (execute_once && index_arr.length) {
                return index_arr
            }
        }
        // 只是查找值
    } else {
        for (let i = 0; i < circulation_times; i++) {
            if (list[i] === target) {
                index_arr.push(i)
            } else if (list[last_index - i] === target) {
                index_arr.push(last_index - i)
            }
            if (execute_once && index_arr.length) {
                return index_arr
            }
        }
    }
    // 如果是奇数，则查找中间那个
    if (is_even_number_or_odd_number) {
        if (isObject && list[circulation_times + 1][obj_key] === target) {
            index_arr.push(circulation_times + 1)
        } else if (list[circulation_times + 1] === target) {
            index_arr.push(circulation_times + 1)
        }
    }
    return index_arr
}

// 筛选数组中的最大值
function queryMaxForArr(arr) {
    if (arr.length < 2) {
        return arr[0]
    }
    const arr_length = arr.length
    let num = arr[0]
    for (let i = 0; i < arr_length; i++) {
        num = num < arr[i] ? arr[i] : num
    }
    return  num
}

// 筛选数组中的最小值
function queryMinForArr(arr) {
    if (arr.length < 2) {
        return arr[0]
    }
    const arr_length = arr.length
    let num = arr[0]
    for (let i = 0; i < arr_length; i++) {
        num = num > arr[i] ? arr[i] : num
    }
    return  num
}

// 计算勾股定理
function distance(point1, point2) {
    // 相当于向量取模
    const real_point = [point2[0] - point1[0], point2[1] - point1[1]]
    return Number(Math.sqrt(Math.pow(real_point[0], 2) + Math.pow(real_point[1], 2)).toFixed(2))
}
